package com.zhu.instructions.stack;

// instructions/stack/DUP.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;
import com.zhu.rtda.Slot;

/**
 * 指令：dup
 *
 * 操作数：无
 *
 * 功能：
 *  复制操作数栈顶的单个变量（占用一个 slot），
 *  并将其再次压入栈顶。
 *
 * 适用类型：
 *  int, float, reference 等占用一个 slot 的值。
 *
 * 栈变化：
 *  ..., value → ..., value, value
 *
 * 典型用途：
 *  在调用实例方法前复制 this 引用，例如：
 *      aload_0       ; 加载 this
 *      dup           ; 复制 this（一份用于调用，一份保留）
 *      invokespecial ; 调用构造函数
 */
public class DUP extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        Slot slot = stack.popSlot();     // 弹出栈顶值
        stack.pushSlot(slot);            // 先压入原值
        stack.pushSlot(slot);            // 再压入复制值（dup）
    }
}
